// Built-in file icon theme mapping for folder tree and tabs
// Uses public/assets under /files-icon/*.svg

const ICON_BASE = '/files-icon/';

const EXT_TO_ICON = {
  // Web
  'js': 'javascript.svg', 'jsx': 'javascript.svg', 'mjs': 'javascript.svg', 'cjs': 'javascript.svg',
  'ts': 'react_ts.svg', 'tsx': 'react_ts.svg',
  'vue': 'nuxt.svg',
  'css': 'css.svg', 'scss': 'css.svg', 'sass': 'css.svg', 'less': 'less.svg',
  'html': 'angular-resolver.svg', 'ejs': 'ejs.svg', 'pug': 'pug.svg', 'hbs': 'handlebars.svg',
  'svg': 'svg.svg',

  // Config / data
  'json': 'json.svg', 'yaml': 'yaml.svg', 'yml': 'yaml.svg', 'lock': 'lock.svg', 'log': 'log.svg',
  'eslintrc': 'eslint.svg', 'eslint': 'eslint.svg', 'raml': 'raml.svg', 'diff': 'diff.svg',

  // Scripts / build / package
  'node': 'nodejs.svg', 'npmrc': 'yarn.svg', 'yarnrc': 'yarn.svg', 'yarn': 'yarn.svg',
  'gulp': 'gulp.svg',

  // Languages
  'rs': 'rust.svg', 'go': 'go.svg', 'py': 'python.svg', 'r': 'r.svg', 'rb': 'ruby.svg', 'zig': 'zig.svg',
  'c': 'c.svg', 'h': 'hpp.svg', 'hpp': 'hpp.svg', 'hh': 'hpp.svg', 'cpp': 'hpp.svg', 'cc': 'hpp.svg',
  'cs': 'csharp.svg', 'java': 'java.svg', 'dart': 'dart.svg', 'm': 'mathematica.svg', 'mxml': 'mxml.svg',

  // Frameworks
  'ng': 'angular-resolver.svg', 'nuxt': 'nuxt.svg', 'ionic': 'ionic.svg', 'django': 'django.svg', 'react': 'react.svg',

  // Docs / notebooks
  'md': 'markdown.svg', 'markdown': 'markdown.svg', 'ipynb': 'jupyter.svg',

  // Misc
  'cuda': 'cuda.svg', 'shader': 'shaderlab.svg', 'restql': 'restql.svg', 'i18n': 'i18n.svg', 'istanbul': 'istanbul.svg',
  'zip': 'zip.svg', 'gz': 'zip.svg', '7z': 'zip.svg', 'rar': 'zip.svg'
};

// Special filenames → icons
const NAME_TO_ICON = {
  'package.json': 'yarn.svg',
  'package-lock.json': 'yarn.svg',
  'yarn.lock': 'yarn.svg',
  '.eslintrc': 'eslint.svg', '.eslintrc.json': 'eslint.svg', '.eslintignore': 'eslint.svg',
  '.gitignore': 'git.svg', '.gitattributes': 'git.svg', '.gitmodules': 'git.svg',
  'favicon.svg': 'favicon.svg',
};

function toPath(iconFile) {
  return ICON_BASE + iconFile;
}

// Phase 1: add a tiny capped cache to avoid recomputing icon src for the same names repeatedly
const _iconCache = new Map();
const MAX_CACHE = 2048;
function _cacheGet(key) { return _iconCache.get(key); }
function _cacheSet(key, val) {
  if (_iconCache.has(key)) { _iconCache.set(key, val); return; }
  _iconCache.set(key, val);
  if (_iconCache.size > MAX_CACHE) {
    const firstKey = _iconCache.keys().next().value;
    if (firstKey !== undefined) _iconCache.delete(firstKey);
  }
}

export function resolveFileIcon(name, options = {}) {
  const { isDir = false } = options;
  const raw = name || '';
  const base = String(raw).split(/[\\\/]/).pop().toLowerCase();
  const cacheKey = `${isDir ? 'D' : 'F'}:${base}`;
  const cached = _cacheGet(cacheKey);
  if (cached) return cached;
  let result;
  if (!base) {
    result = toPath('lib.svg');
  } else if (isDir) {
    // Use library icon for directories for now
    result = toPath('lib.svg');
  } else if (NAME_TO_ICON[base]) {
    // explicit name mapping
    result = toPath(NAME_TO_ICON[base]);
  } else {
    // extension mapping
    const parts = base.split('.');
    if (parts.length > 1) {
      const ext = parts.pop();
      if (ext && EXT_TO_ICON[ext]) result = toPath(EXT_TO_ICON[ext]);
    }
    if (!result) {
      // try exact base as key (e.g., rc files handled above)
      if (EXT_TO_ICON[base]) result = toPath(EXT_TO_ICON[base]);
    }
    if (!result) result = toPath('lib.svg');
  }
  _cacheSet(cacheKey, result);
  return result;
}


